/*
 * 版权所有 (C) 2021 中国南方航空股份有限公司。
 * 本文件可能包含有南方航空公司的机密或专有信息。
 * 未经许可不得擅自公开、复制这些机密资料及其中任何部分，
 * 只可按照其使用许可协议，在南方航空公司内部使用。
 *
 * File Name: $(#)TestReTryController.java
 * Creation Date: 2021年10月21日 下午5:03:15
 * $Id$
 */
package com.andy.note.boot.controller.retry;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.retry.annotation.Backoff;
import org.springframework.retry.annotation.Recover;
import org.springframework.retry.annotation.Retryable;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import lombok.extern.slf4j.Slf4j;

/**
 * <p>
 * DOCUMENTME <code>com.andy.note.boot.controller.retry.TestReTryController</code>类的说明
 * </p>
 * <p>
 * Function List:
 * <li>TODO 添加功能名称及描述</li>
 * </p>
 * <p>
 * Revision History:
 * <ul>
 * <li>2021年10月21日 90811 初始版本</li>
 * </ul>
 * </p>
 *
 * @author zhouguoan 908119428@qq.com
 * @version $Revision: 1.1 $ $Date: 2021年10月21日 下午5:03:15 $
 */
@RestController
@RequestMapping("/springRetry")
@Slf4j
public class TestReTryController {
    @Autowired
    private SpringRetryService pringRetryService;
    @RequestMapping("/testSpringRetry")
    public Integer testSpringRetry() {
        log.info("invoke method testSpringRetry! ");
        Integer b = 0;
        try {
            b = pringRetryService.testRetry();
        } catch (Exception e) {
            log.error("重试失败了", e);
        }
        return b;
    }
    
    @RequestMapping("/testSpringRetrya")
    public String testSpringRetrya() {
        log.info("invoke method testSpringRetry! ");
        String b = null;
        try {
            b = pringRetryService.testRetrya();
        } catch (Exception e) {
            log.error("重试失败了", e);
        }
        return b;
    }
}
/**
 * @author 蒋墨风
 * @title: SpringRetryService
 * @projectName client1
 * @description: 测试SpringRetry
 * @date 2019/10/19 8:51
 */
@Service
@Slf4j
class SpringRetryService {
 
    @Retryable(value = {Exception.class}, maxAttempts = 3, backoff =@Backoff(value = 3000, 
    multiplier = 1))
    public Integer testRetry() throws Exception {
        Integer i = 1;
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try {
            log.info("重试方法被调用，当前时间是" + sdf.format(new Date()));
            int a = 9 / 0;
            i = 2;
        } catch (Exception e) {
            throw new RuntimeException("重试之后，还是失败了！", e);
        }
        return i;
    }
    
    @Retryable(value = {Exception.class}, maxAttempts = 3, backoff =@Backoff(value = 3000, 
            multiplier = 1))
    public String testRetrya() throws Exception {
        String result = "testRetrya is null";
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try {
            log.info("重试方法被调用，当前时间是" + sdf.format(new Date()));
            int i = 9 / 0;
            result = "testRetrya";
        } catch (Exception e) {
            throw new RuntimeException("重试之后，还是失败了！", e);
        }
        return result;
    }
    
    @Recover
    public String testRecoverya(Exception e) {
        log.warn("重试依旧失败了，这时候就需要发送短信报警啦！");
        return "testRecoverya";
    }
    
    @Recover
    public Integer testRecovery(Exception e) {
        log.warn("重试依旧失败了，这时候就需要发送短信报警啦！");
        return 3;
    }
}